﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TicketsPhone.Domain.Entities;
using TicketsPhone.Domain.Access;

namespace TicketsPhone.Web.Models
{
    /// <summary>
    /// Clase que tiene la estructura base para los demás modelos existentes
    /// </summary>
    public class BaseModel
    {
        public BaseModel()
        {
            ModuloRepositorio _modulos = new ModuloRepositorio();
            ModulosPermitidos = _modulos.ObtenerModulosPermitidos(SesionModel.IdPerfil);
        }

        /// <summary>
        /// Contiene el listado de modulos a los que el usuario puede acceder
        /// </summary>
        public List<Modulo> ModulosPermitidos { get; set; }

        /// <summary>
        /// Contiene la cadena por la que se desea buscar en el general
        /// </summary>
        public string Buscador { get; set; }

        public TipoTransaccion Accion { get; set; }

        /// <summary>
        /// Contiene la cadena de un javascript que se desee ejecutar
        /// </summary>
        private string _javascript = string.Empty;
        public string Javascript
        {
            get { return _javascript; }
            set { _javascript = string.Format("<script>{0}</script>", value); }
        }

    }
    
    /// <summary>
    /// Contiene los datos base para los modulos que listan y retornan objetos
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class BaseModel<T> : BaseModel
    {
        public BaseModel()
        {
            Paginador = new PaginadorModel();
            if(TicketsPhone.Web.Utils.Utilidades.ValidarRequest("pag"))
            {
                Paginador.PaginaActual = Convert.ToInt32(HttpContext.Current.Request.QueryString["pag"]);
            }
        }
        
        /// <summary>
        /// Retorna el Objeto perteneciente a la clase principal
        /// </summary>
        public T Objeto {get; set;}

        /// <summary>
        /// Retorna el listado de objetos del módulo
        /// </summary>
        public List<T> Listado { get; set; }

        /// <summary>
        /// Contiene la información básica del paginador actual
        /// </summary>
        public PaginadorModel Paginador { get; set; }

        /// <summary>
        /// Retorna un listado con los datos paginados, dependiendo del paginador
        /// </summary>
        /// <returns></returns>
        public void CargarDatosPaginados(List<T> lista)
        {
            Paginador.NumeroRegistros = lista.Count;
            Paginador.NumeroPaginas = (int)Math.Ceiling(Convert.ToDouble((double)Paginador.NumeroRegistros / (double)Paginador.RegistrosPorPagina));
            Listado = lista.Skip(Paginador.RegistrosPorPagina * (Paginador.PaginaActual-1)).Take(Paginador.RegistrosPorPagina).ToList();
        }


        
    }

}
